#include "uart.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "esp_log.h"


static QueueHandle_t uart_queue;
static uint8_t frame_buffer[FRAME_SIZE];
static uint8_t frame_index = 0;
static bool frame_start = false;
static const char *TAG = "UART_FRAME";
// 帧数据处理函数
static void process_frame(uint8_t *frame) {
    // 这里添加实际的数据处理逻辑
    ESP_LOGI(TAG, "Valid Frame: %02X %02X %02X %02X %02X %02X %02X %02X",
            frame[0], frame[1], frame[2], frame[3],
            frame[4], frame[5], frame[6], frame[7]);
}
// UART事件处理任务
void uart_event_task(void *pvParameters) {
    uart_event_t event;
    uint8_t data[RX_BUF_SIZE];
    
    while (1) {
        if (xQueueReceive(uart_queue, (void *)&event, portMAX_DELAY)) {
            if (event.type == UART_DATA) {
                int len = uart_read_bytes(USART_UX, data, event.size, portMAX_DELAY);
                
                for (int i = 0; i < len; i++) {
                    if (!frame_start) {
                        // 寻找帧头
                        if (data[i] == FRAME_HEADER) {
                            frame_start = true;
                            frame_index = 0;
                            frame_buffer[frame_index++] = data[i];
                        }
                    } else {
                        // 收集帧数据
                        frame_buffer[frame_index++] = data[i];
                        
                        // 完成一帧接收
                        if (frame_index >= FRAME_SIZE) {
                            process_frame(frame_buffer);
                            frame_start = false;
                        }
                    }
                }
            }
            else if (event.type == UART_FIFO_OVF || event.type == UART_BUFFER_FULL) {
                ESP_LOGE(TAG, "UART Overflow! Data may be lost!");
                uart_flush_input(USART_UX);
                frame_start = false; // 重置状态
            }
        }
    }
}


/************************************************************
 * @brief       初始化串口
 * @param       baudrate: 波特率, 根据自己需要设置波特率值
 * @note        注意: 必须设置正确的时钟源, 否则串口波特率就会设置异常.
 * @retval      无
 ****************************************************************/
void usart_init(uint32_t baudrate)
{
    uart_config_t uart_config={                                 /* 串口配置句柄 */
                    .baud_rate  =   baudrate,                  /* 波特率 */
                    .data_bits  =   UART_DATA_8_BITS,           /* 字长为8位数据格式 */
                    .parity     =   UART_PARITY_DISABLE,        /* 无奇偶校验位 */
                    .stop_bits  =   UART_STOP_BITS_1,           /* 一个停止位 */
                    .flow_ctrl  =   UART_HW_FLOWCTRL_DISABLE,   /* 无硬件控制流 */
                    .source_clk =   UART_SCLK_APB,              /* 配置时钟源 */
                    .rx_flow_ctrl_thresh    =   122             /* 硬件控制流阈值 */
    };                         
    uart_param_config(USART_UX, &uart_config);          /* 配置uart端口 */

    /* 配置uart引脚 */
    uart_set_pin(USART_UX, USART_TX_GPIO_PIN, USART_RX_GPIO_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);

    /* 安装串口驱动 */
    uart_driver_install(USART_UX, RX_BUF_SIZE * 2, RX_BUF_SIZE * 2, 20, &uart_queue, 0);

    /* 串口接收线程 */
    xTaskCreate(uart_event_task, "uart_event_task", 4096, NULL, 10, NULL);
}
